﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Data.OleDb;

namespace DiaryPlanner
{
    public partial class AlbumFolder : PictureBox
    {
        public ContextMenu folderMenu = new ContextMenu();
        public Album thisAlbumObject;
        public String folderName;//보여지는 폴더 이름
        public String realName;//진짜 폴더 이름

        public ArrayList PhotoList = new ArrayList(); //폴더 안의 사진들의 리스트

        public AlbumFolder(Album ab)
        {
            thisAlbumObject = ab;
            folderMenu.MenuItems.Add("삭제", deleteFolder);
            InitializeComponent();
            
        }

        private void folderPictureBox_Click(object sender, EventArgs e)//폴더 이미지 클릭
        {
            //nowFolder와 이 폴더가 같다면 아무 일도 하지 않음
            if (thisAlbumObject.nowFolder == this) return;

            //else
            thisAlbumObject.closeFolderImage(thisAlbumObject.nowFolder);
            thisAlbumObject.nowFolder = this; // Album의 nowFolder(현재 폴더)는 이 폴더로 지정
            thisAlbumObject.openFolderImage(thisAlbumObject.nowFolder);

            
                        
            //오른쪽 photoPanel에 photoList에 있는 사진들 뿌려주기
            thisAlbumObject.viewAllPhoto();
            
        }

        public void deleteFolder(object sender, EventArgs e)
        {
            //폴더와 사진들을 db에서 삭제                 
            AlbumPhoto albp = new AlbumPhoto(thisAlbumObject);

            foreach (AlbumPhoto ap in thisAlbumObject.nowFolder.PhotoList)
            {
                /////////////////////////////////////////////////////// db에서 사진 삭제 
                //해당 사진을 삭제
                
                albp.del_db(ap.photoName);
                ////////////////////////////////////////////////////////
                ap.Image.Dispose();
                ap.Dispose();
            }

            albp = null;
            String fname = thisAlbumObject.nowFolder.realName;

            //thisAlbumObject.nowFolder.PhotoList.Clear();
            thisAlbumObject.nowFolder.PhotoList = null;

            thisAlbumObject.FolderList.Remove(thisAlbumObject.nowFolder);

            thisAlbumObject.closeFolderImage(thisAlbumObject.nowFolder);
            thisAlbumObject.nowFolder = null;
            thisAlbumObject.nowPhoto = null;

            thisAlbumObject.viewAllFolder();
            thisAlbumObject.viewAllPhoto();

            del_db(fname);

            try
            {
                Directory.Delete(Application.StartupPath+"/UserImage/" + UserProfile.Instance().userId + "/Album/" + fname, true);
            }
            catch
            {

            }
             

        }

        private void folderPictureBox_MouseDown(object sender, MouseEventArgs e)
        {
            //mouse down 왼쪽 이벤트는 처리하지 않음
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left) return;

            //오른쪽 마우스 down 이벤트만 처리


            ////만일 이 폴더가 nowFolder라면, photoPanel의 내용을 없앤다
            //if(thisAlbumObject.nowFolder==this){

            //    thisAlbumObject.photoPanel.Controls.Clear();

            //}

            //이 폴더 삭제 메뉴
            if (thisAlbumObject.nowFolder != this)
            {
                thisAlbumObject.closeFolderImage(thisAlbumObject.nowFolder);
                thisAlbumObject.nowFolder = this;
                thisAlbumObject.openFolderImage(thisAlbumObject.nowFolder);
                thisAlbumObject.viewAllPhoto();
            }
            Point m = this.PointToClient(new Point(Control.MousePosition.X, Control.MousePosition.Y));
            folderMenu.Show(this, m);

        }

        //realName : realName
        private void del_db(string realName)
        {
            try
            {

                string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" //연결하는 객체의 공급자명(확장자명)
                                         + "data source = "  //데이터 소스=(경로입력하라는거)
                                         + Application.StartupPath ///상대경로 읽어옴
                                         + @"\diaryplannerdb.mdb";//실제 데이터베이스 파일이름

                string commandString = "Select * from [photo_folder]";//photo_folder테이블에 있는 모든필드들을 모두 검색해라.

                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "photo_folder"); //DS라는 데이터셋에 새로운 photo_folder 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["photo_folder"];//photo_folder테이블을 불러와 aTable을 새로 생성해서 저장

                DataColumn[] PrimaryKey = new DataColumn[1];

                PrimaryKey[0] = aTable.Columns["realName"]; //a컬럼을 기본키를 설정

                aTable.PrimaryKey = PrimaryKey;//기본키 할당

                DataRow currRow1 = aTable.Rows.Find(realName); //textBox값인 기본키 선택
                currRow1.Delete(); //삭제

                DBAdapter.Update(DS.GetChanges(DataRowState.Deleted), "photo_folder");
            }
            catch (DataException DE)
            {
                MessageBox.Show(DE.Message);
            }
            catch (Exception DE)
            {
                MessageBox.Show(DE.Message);
            }
        }
        

    }
}
